package com.agile.leetcode.tomcat.servletscanner;


import com.agile.leetcode.tomcat.anotation.Address;

import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * 自定义路径扫描器
 *
 * @Author KD
 * @Date 2021/2/6 14:20
 */
public class AddressScanner {
    /**
     * 定义容器存储路径
     */
    private static Map<String, Class> map = new HashMap<>(16);

    /**
     * 扫描路径下的类
     *
     * @param basePackage
     */
    public static void scan(String basePackage) {
        // 拿到资源路径
        URL resource = AddressScanner.class.getClassLoader().getResource(basePackage.replaceAll("\\.", "/"));
        // 拿到文件地址
        String fileStr = resource.getFile();
        // 转为文件
        File file = new File(fileStr);
        // 拿到全部文件
        String[] list = file.list();
        // 遍历
        for (String s : list) {
            // 转为文件
            File file1 = new File(fileStr + "/" + s);
            // 是否是文件
            if (file1.isDirectory()) {
                scan(basePackage + "." + s);
            } else {
                // 拿到字节码
                try {
                    Class<?> clazz = Class.forName((basePackage + "." + s).replaceAll(".class", ""));
                    // 是否被路径标记
                    if (clazz.isAnnotationPresent(Address.class)) {
                        // 拿到地址
                        Address annotation = clazz.getAnnotation(Address.class);
                        String address = annotation.value();
                        // 检查是否有冲突
                        if (map.containsKey(address)) {
                            throw new RuntimeException("路径有重复，请检查" + address);
                        } else {
                            map.put(address, clazz);
                        }
                    }
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static Map<String, Class> getAddress() {
        return map;
    }
}
